package com.im;

import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

// 聊天窗口
@SuppressWarnings("serial")
class ChatWindow extends JDialog implements ActionListener {
    // 回调
    public interface Callback {
        void onChatC2S(ChatInfo chat);  // 聊天事件（客户端到服务器）
    }
    
    private final Callback mCallback;       // 回调
    private final JTextArea mEditHistory;   // 聊天历史编辑框
    private final JTextArea mEditInput;     // 聊天内容编辑框
    private final String mFriendName;       // 好友名

    /**
     * 构造方法。
     * @param callback  回调
     * @param parent    父窗口
     * @param username  用户名
     */
    public ChatWindow(Callback callback, Frame parent, String username) {
        super(parent);
        
        // 初始化成员
        mCallback = callback;
        mEditHistory = new JTextArea(Const.CHAT_WINDOW_EDIT_HISTORY_ROW, 0);
        mEditInput = new JTextArea(Const.CHAT_WINDOW_EDIT_INPUT_ROW, 0);
        mFriendName = username;
        
        // 设置窗口标题
        super.setTitle(username);

        // 设置窗口尺寸不能改变
        super.setResizable(false);
        
        // 设置窗口尺寸
        super.setSize(Const.CHAT_WINDOW_WIDTH, Const.CHAT_WINDOW_HEIGHT);

        // 设置窗口居中
        super.setLocationRelativeTo(null);

        // 设置窗口布局
        final GridBagLayout gbl = new GridBagLayout();
        super.setLayout(gbl);

        // 创建网格袋布局约束对象
        final GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.weightx = 1;

        // 添加控件
        /* 添加聊天历史编辑框 */
        mEditHistory.setLineWrap(true);
        mEditHistory.setFocusable(false);
        mEditHistory.setEditable(false);
        JScrollPane jsp = new JScrollPane(mEditHistory);
        gbc.weighty = 0.8;
        gbc.insets = new Insets(Const.CHAT_WINDOW_CTRL_INSET_H, Const.CHAT_WINDOW_CTRL_INSET_H, 0, Const.CHAT_WINDOW_CTRL_INSET_H);
        gbl.setConstraints(jsp, gbc);
        super.add(jsp);
        
        /* 添加聊天内容编辑框 */
        mEditInput.setLineWrap(true);
        mEditInput.setDocument(new LimitDocument(Const.MAX_CONTENT_LEN));   // 设置最大输入长度
        mEditInput.requestFocus();
        jsp = new JScrollPane(mEditInput);
        gbc.weighty = 0.19;
        gbc.insets = new Insets(1, Const.CHAT_WINDOW_CTRL_INSET_H, Const.CHAT_WINDOW_CTRL_INSET_V, Const.CHAT_WINDOW_CTRL_INSET_H);
        gbl.setConstraints(jsp, gbc);
        super.add(jsp);

        /* 添加发送按钮 */
        gbc.weighty = 0.01;
        gbc.insets = new Insets(Const.CHAT_WINDOW_CTRL_INSET_V, 
            Const.CHAT_WINDOW_CTRL_INSET_H, Const.CHAT_WINDOW_CTRL_INSET_H, Const.CHAT_WINDOW_CTRL_INSET_H);
        JButton buttonSend = new JButton(Const.getString("IDS_SEND"));    
        gbl.setConstraints(buttonSend, gbc);
        buttonSend.addActionListener(this);
        super.add(buttonSend);
    }

    /**
     * "发送"按钮的单击响应方法。
     * @param e 事件相关信息
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        // 获取用户输入的聊天内容
        String content = mEditInput.getText();

        // 获取当前时间
        final String time = new SimpleDateFormat(Const.DATE_TIME_FORMAT).format(new Date());

        // 显示聊天内容
        final ChatInfo chatInfo = new ChatInfo(content, mFriendName, 0, Client.getUsername(), time);
        this.setContent(chatInfo);

        // 清空聊天内容编辑框
        mEditInput.setText("");

        // 发送聊天信息
        mCallback.onChatC2S(chatInfo);
    }

    /**
     * 设置聊天内容。
     * @param chatInfo  聊天信息
     */
    public void setContent(ChatInfo chatInfo) {
        // 显示聊天内容
        final String show = chatInfo.mSrcUsername + Const.LEFT_BR + chatInfo.mTime + Const.RIGHT_BR + chatInfo.mContent + Const.WRAP;
        final String content = mEditHistory.getText() + show;
        mEditHistory.setText(content);
        
        // 滚动到最底行
        mEditHistory.setCaretPosition(mEditHistory.getText().length());
    }
}
